package com.kyl.base;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * DTO基类
 *
 * 本类作为数据传输对象（DTO）的基类，定义了一些通用的属性和方法，
 * 用于在整个应用中传递数据。通过实现Serializable接口，确保了对象的可序列化性，
 * 以便于在网络传输或存储时序列化和反序列化。
 */
@Data
@NoArgsConstructor
@ApiModel("DTO基类")
public class BaseDto  implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 用于唯一标识一个实体对象，是数据库表中的主键字段映射。
     */
    @ApiModelProperty(value = "主键")
    private Long id;

    /**
     * 用于模糊搜索的功能，不参与序列化和反序列化过程，以避免在API响应中暴露。
     */
    @JsonIgnore
    @ApiModelProperty(value = "搜索值")
    private String searchValue;

    /**
     * 用于记录额外的说明或注释信息，可以是任意自由文本。
     */
    @ApiModelProperty(value = "备注")
    private String remark;

    /**
     * 用于存储额外的请求参数，不参与序列化和反序列化过程，以避免在API响应中直接暴露。
     * 这允许在处理请求时动态添加和访问额外的参数。
     */
    @JsonIgnore
    @ApiModelProperty(value = "请求参数")
    private Map<String, Object> params;

    /**
     * 获取请求参数
     *
     * 如果params属性为空，则初始化为一个新的HashMap并返回，
     * 这样可以避免在调用时进行空值检查，简化了调用方的代码。
     *
     * @return Map<String, Object> 请求参数的映射
     */
    public Map<String, Object> getParams() {
        if (params == null) {
            params = new HashMap<>();
        }
        return params;
    }

    /**
     * 设置请求参数
     *
     * 允许外部设置整个参数映射，提供了灵活性和扩展性。
     *
     * @param params 请求参数的映射
     */
    public void setParams(Map<String, Object> params) {
        this.params = params;
    }
}
